package com.wjn.basic.thread.AqsDemo;
import java.util.concurrent.Semaphore;

/**
 * AQS
 * semaphore
 * 也是一个线程同步的辅助类，可以维护当前访问自身的线程个数，并提供了同步机制。
 * 以控制同时访问资源的线程个数，例如，实现一个文件允许的并发访问数。
 * 一个线程获取许可证就调用acquire方法，用完了释放资源就调用release方法。
 */
public class SemaphoreDemo extends Thread {
    private Semaphore semaphore=null;
    private int num;
    public SemaphoreDemo(Semaphore semaphore,int num){
        this.semaphore=semaphore;
        this.num=num;
    }

    @Override
    public void run() {
        try {
            semaphore.acquire();
            System.out.println("第"+this.num+"拿到许可了");
            sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        finally {
            semaphore.release();//释放
        }
    }


    public static void main(String[] args) {
        Semaphore semaphore=new Semaphore(3);
        for (int i=0;i<10;i++){
            new SemaphoreDemo(semaphore,i).start();
        }
    }
}
